package eshop.local.persistence;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.util.List;
import java.util.Vector;

import eshop.local.valueobjects.*;

public class PersistenzManager {

	public PrintWriter pw = null;
	public BufferedReader br = null;

/**
 * Datei abspeichern	 	
 * @param name
 * @throws IOException
 */
	public void DateiAbspeichern(String name) throws IOException {
		
		FileWriter fw = new FileWriter(name);
		BufferedWriter bw = new BufferedWriter( fw );
		pw = new PrintWriter( bw );   	
	}

	/**
	 * Datei laden
	 * @param datei
	 * @throws FileNotFoundException
	 */
	public void DateiLaden(String datei) throws FileNotFoundException {	

		FileReader fr = new FileReader(datei);
		br = new BufferedReader(fr);				
	}

	/**
	 * Artikel laden
	 * @return
	 * @throws IOException
	 */
	public Artikel geladenerArtikel() throws IOException {

		String na = leseDaten();
		if (na == null) 
			return null;
		// andere Typen in String umwandeln
		String nummerString = leseDaten();
			int nu = Integer.parseInt(nummerString);
		String nummerPreis = leseDaten();
			float prei = Float.parseFloat(nummerPreis);	
		String nummerAnzahl = leseDaten();
			int anz = Integer.parseInt(nummerAnzahl);	
		String nummerMin = leseDaten();
			int min = Integer.parseInt(nummerMin);
		String mindestMenge = leseDaten();
			int mb = Integer.parseInt(mindestMenge);
			
		return new Artikel(nu,na,prei,anz,min,mb);
	}

	/**
	 * Kunde laden
	 * @return
	 * @throws IOException
	 */
	public Kunde geladenerKunde() throws IOException {

		String na = leseDaten();
		if (na == null) 
			return null;
			
		String UserNummerString = leseDaten();
			int nu = Integer.parseInt(UserNummerString);
		String pw = leseDaten();
		String s = leseDaten();
		String o = leseDaten();
		String e = leseDaten();
		
		return new Kunde(nu,na, pw, s, o, e);
	}
	
	
	public Mitarbeiter geladenerMitarbeiter() throws IOException {

		String na = leseDaten();
		if (na == null) 
			return null;
			
		String MitarbeiterNummerString = leseDaten();
			int nu = Integer.parseInt(MitarbeiterNummerString);
		String pw = leseDaten();
		String s = leseDaten();
		String o = leseDaten();
		String e = leseDaten();
		
		return new Mitarbeiter(nu,na, pw, s, o, e);
	}
	
	/**
	 * Transfer laden
	 * @return
	 * @throws IOException
	 */
	public Transfer geladenerTransfer() throws IOException {
		
		String t = leseDaten();
		int tNummer;
		if (t == null) {
			return null;
		} else {
		tNummer  = Integer.parseInt(t);
		}
		
		String u = leseDaten();
		int uNummer = Integer.parseInt(u);
		
		String a = leseDaten();
		int aNummer = Integer.parseInt(a);
			
		String z = leseDaten();
		int anzahl = Integer.parseInt(z);
		
		String d = leseDaten();
		String date = d;
				
		return new Transfer(tNummer,uNummer,aNummer,anzahl,date);
	}

	/**
	 * Artikel speichern
	 * @param A
	 * @throws IOException
	 */
	public void speichereArtikel(Artikel a) throws IOException {

		schreibeDaten(a.getName());
		schreibeDaten(new Integer(a.getNummer()).toString());		
		schreibeDaten(new Float(a.getPreis()).toString());	
		schreibeDaten(new Integer(a.getAnzahl()).toString());
		schreibeDaten(new Integer(a.getMindestBestand()).toString());
		schreibeDaten(new Integer(a.getMindestMenge()).toString());
	} 

	/**
	 * Kunde speichern
	 * @param U
	 * @throws IOException
	 */
	public void speichereKunde(Kunde k) throws IOException {
		schreibeDaten(k.getName());
		schreibeDaten(new Integer(k.getNummer()).toString());
			// von Int zu String
		schreibeDaten(k.getPw());
		schreibeDaten(k.getStrasse());
		schreibeDaten(k.getOrt());
		schreibeDaten(k.getEmail());
	}  
	
	public void speichereMitarbeiter(Mitarbeiter m) throws IOException {
		schreibeDaten(m.getName());
		schreibeDaten(new Integer(m.getNummer()).toString());
			// von Int zu String
		schreibeDaten(m.getPw());
		schreibeDaten(m.getStrasse());
		schreibeDaten(m.getOrt());
		schreibeDaten(m.getEmail());
	}  

	

	public void speichereTransfer(Transfer t) throws IOException {

		schreibeDaten(new Integer(t.getTnummer()).toString());	
		schreibeDaten(new Integer(t.getMnummer()).toString());	
		schreibeDaten(new Integer(t.getAnummer()).toString());	
		schreibeDaten(new Integer(t.getAnzahl()).toString());	
		schreibeDaten(new Integer(t.getDate()).toString());	
	} 
	




	private String leseDaten() throws IOException {
		if (br != null)
			return br.readLine();
		else
			return "";
	}
			
	private void schreibeDaten(String daten) {
		if (pw != null)
			pw.println(daten);
	}	
	
	@SuppressWarnings("unchecked")
	public Object rechnungenLaden(String dateiR) throws IOException, ClassNotFoundException {
		FileInputStream in = new FileInputStream(dateiR);
		ObjectInputStream ois = new ObjectInputStream(in);
		Object rechnungen = null;
		try{
			rechnungen = ois.readObject();
			ois.close();
			System.out.println("# Rechnungen laden erfolgreich "+rechnungen);
		} catch (IOException e) {
			System.out.println("# Rechnungen laden fehlgeschlagen");
			}
		return rechnungen;
	}
	
	public void rechnungenSpeichern(Object o, String save) throws IOException{
		FileOutputStream f = new FileOutputStream(save);
		ObjectOutputStream s = new ObjectOutputStream(f);
		try {
		s.writeObject(o);
		System.out.println("# Rechnungen speichern erfolgreich" + o);
		} catch (IOException e) {
			System.out.println("# Rechnungen speichern fehlgeschlagen");
			}
		s.close();
	}
	
	
	
	public void close(){
		
		if (pw != null)
				pw.close();
			
			if (br != null) {
				try {
					br.close();
				} catch (IOException e) {
				e.printStackTrace();
				}
			}
	}

}
